
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
<meta name="description" content="Redis真的那么好用吗？中国Redis用户组（CRUG）之网络文章大全">


        <title>
 Redis真的那么好用吗？
</title>
        
<style>.radius_avatar{display:inline-block;background-color:#fff;padding:3px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;overflow:hidden;vertical-align:middle}.radius_avatar img{display:block;width:100%;height:100%;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;background-color:#eee}.rich_media_inner{word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.rich_media_area_primary{padding:20px 16px 12px;background-color:#fafafa}.rich_media_area_primary.voice{padding-top:66px}.rich_media_area_primary .weui-loadmore_line .weui-loadmore__tips{color:rgba(0,0,0,0.3);background-color:#fafafa}.rich_media_area_extra{padding:0 16px 24px}.rich_media_extra{padding-top:30px}.mpda_bottom_container .rich_media_extra{padding-top:24px}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.6}body{-webkit-touch-callout:none;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;color:#333;background-color:#f2f2f2;letter-spacing:.034em}h1,h2,h3,h4,h5,h6{font-weight:400;font-size:16px}*{margin:0;padding:0}a{color:#576b95;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rich_media_title{font-size:22px;line-height:1.4;margin-bottom:14px}@supports(-webkit-overflow-scrolling:touch){.rich_media_title{font-weight:700}}.rich_media_meta_list{margin-bottom:22px;line-height:20px;font-size:0;word-wrap:break-word;word-break:break-all}.rich_media_meta_list em{font-style:normal}.rich_media_meta{display:inline-block;vertical-align:middle;margin:0 10px 10px 0;font-size:15px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rich_media_meta.icon_appmsg_tag{margin-right:4px}.rich_media_meta.meta_tag_text{margin-right:0}.rich_media_meta_primary{display:block;margin-bottom:10px;font-size:15px}.meta_original_tag{padding:0 .5em;font-size:12px;line-height:1.4;background-color:#f2f2f2;color:#888}.meta_enterprise_tag img{width:30px;height:30px!important;display:block;position:relative;margin-top:-3px;border:0}.rich_media_meta_link{color:#576b95}.rich_media_meta_text{color:rgba(0,0,0,0.3)}.rich_media_meta_text.rich_media_meta_split{padding-left:10px}.rich_media_meta_text.rich_media_meta_split:before{position:absolute;top:50%;left:0;margin-top:-6px;content:' ';display:block;border-left:1px solid #888;width:200%;height:130%;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-transform:scale(0.5);transform:scale(0.5);-webkit-transform-origin:0 0;transform-origin:0 0}.rich_media_meta_text.article_modify_tag{position:relative}.rich_media_meta_nickname{position:relative}.rich_media_thumb_wrp{margin-bottom:6px}.rich_media_thumb_wrp .original_img_wrp{display:block}.rich_media_thumb{display:block;width:100%}.rich_media_content{overflow:hidden;color:#333;font-size:17px;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;text-align:justify}.rich_media_content *{max-width:100%!important;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;word-wrap:break-word!important}.rich_media_content p{clear:both;min-height:1em}.rich_media_content em{font-style:italic}.rich_media_content fieldset{min-width:0}.rich_media_content .list-paddingleft-2{padding-left:2.2em}.rich_media_content .list-paddingleft-2 .list-paddingleft-2{padding-left:30px}.rich_media_content blockquote{margin:0;padding-left:10px;border-left:3px solid #dbdbdb}.weui-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;background:rgba(0,0,0,0.6)}.weui-dialog{position:fixed;z-index:5000;width:80%;max-width:300px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}.weui-dialog__hd{padding:1.3em 1.6em .5em}.weui-dialog__title{font-weight:400;font-size:18px}.weui-dialog__bd{padding:0 1.6em .8em;min-height:40px;font-size:15px;line-height:1.3;word-wrap:break-word;word-break:break-all;color:#999}.weui-dialog__bd:first-child{padding:2.7em 20px 1.7em;color:#353535}.weui-dialog__ft{position:relative;line-height:48px;font-size:18px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-dialog__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.weui-dialog__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative}.weui-dialog__btn:active{background-color:#eee}.weui-dialog__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(0.5);transform:scaleX(0.5)}.weui-dialog__btn:first-child:after{display:none}.weui-dialog__btn_default{color:#353535}.weui-dialog__btn_primary{color:#0bb20c}img{height:auto!important}@media only screen and (device-width:375px) and (device-height:812px) and (-webkit-device-pixel-ratio:3) and (orientation:portrait){.rich_media_area_extra{padding-bottom:34px}}@media only screen and (device-width:375px) and (device-height:812px) and (-webkit-device-pixel-ratio:3) and (orientation:landscape){.rich_media_area_primary{padding:20px 60px 15px 60px}.rich_media_area_extra{padding:0 60px 21px 60px}}@media screen and (min-width:1024px){.rich_media_area_primary_inner,.rich_media_area_extra_inner{max-width:677px;margin-left:auto;margin-right:auto}.rich_media_area_primary{padding-top:32px}}.appmsg_share_notice{font-size:16px;color:#888;position:relative;padding:1.25em 0;margin-bottom:1.75em}.appmsg_share_notice:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #dfdfdf;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.appmsg_share_notice:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #dfdfdf;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.appmsg_share_notice_hd{font-weight:700;padding-bottom:.2em}.cell{padding:.8em 0;display:block;position:relative}.cell_hd,.cell_bd,.cell_ft{display:table-cell;vertical-align:middle;word-wrap:break-word;word-break:break-all;white-space:nowrap}.cell_primary{width:2000px;white-space:normal}.flex_cell{padding:10px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.flex_cell_primary{width:100%;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;box-flex:1;flex:1}.original_tool_area{display:block;padding:.75em 1em 0;-webkit-tap-highlight-color:rgba(0,0,0,0);color:#333;border:1px solid #eaeaea;margin:20px 0}.original_tool_area .tips_global{position:relative;padding-bottom:.5em;font-size:15px}.original_tool_area .tips_global:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #dbdbdb;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.original_tool_area .radius_avatar{width:27px;height:27px;padding:0;margin-right:.5em}.original_tool_area .radius_avatar img{height:100%!important}.original_tool_area .flex_cell_bd{width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.original_tool_area .flex_cell_ft{font-size:14px;color:#888;padding-left:1em;white-space:nowrap}.original_tool_area .icon_access:after{content:" ";display:inline-block;height:8px;width:8px;border-width:1px 1px 0 0;border-color:#cbcad0;border-style:solid;transform:matrix(0.71,0.71,-0.71,0.71,0,0);-ms-transform:matrix(0.71,0.71,-0.71,0.71,0,0);-webkit-transform:matrix(0.71,0.71,-0.71,0.71,0,0);position:relative;top:-2px;top:-1px}.rich_media_global_msg{position:fixed;top:0;left:0;right:0;padding:.85em 35px .85em 15px;z-index:2;background-color:#c6e0f8;color:#888;font-size:12px}.rich_media_global_msg .icon_closed{position:absolute;right:15px;top:50%;margin-top:-5px;line-height:300px;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);background:transparent url(//res.wx.qq.com/mmbizwap/zh_CN/htmledition/images/icon/appmsg/icon_appmsg_msg_closed_sprite.2x2eb52b.png) no-repeat 0 0;width:11px;height:11px;vertical-align:middle;display:inline-block;-webkit-background-size:100% auto;background-size:100% auto}.rich_media_global_msg .icon_closed:active{background-position:0 -17px}.rich_media_global_msg.voice{color:#1aad19;background-color:#e8f6e8;padding-left:43.3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rich_media_global_msg.voice .ic_voice{position:absolute;top:50%;margin-top:-10px;left:15px;display:inline-block;width:13.3px;height:18.3px;background:url() no-repeat center;background-size:contain}.rich_media_global_msg.voice .icon_more{position:absolute;right:15px;top:50%;margin-top:-6.5px;width:8px;height:13px;background:url() no-repeat center;background-size:contain}.preview_appmsg .rich_media_title{margin-top:2.3em}@media screen and (min-width:1024px){.rich_media_global_msg{position:relative;margin-bottom:32px}.preview_appmsg .rich_media_title.rich_media_title{margin-top:0}}.pages_reset{color:#333;line-height:1.6;font-size:16px;font-weight:400;font-style:normal;text-indent:0;letter-spacing:normal;text-align:left;text-decoration:none;white-space:normal}.weapp_element,.weapp_display_element,.mp-miniprogram{display:block;margin:1em 0}.share_audio_context{margin:16px 0}.weapp_text_link{font-size:17px}.weapp_text_link:before{content:'';display:inline-block;line-height:1;background-size:contain;background-repeat:no-repeat;background-image:url('');vertical-align:middle;font-size:11px;color:#888;margin-right:6px;margin-top:-3px;background-position:center;height:20px;width:20px}.flex_context{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.flex_bd{-webkit-box-flex:1;-webkit-flex:1;flex:1;word-wrap:break-word;word-break:break-all}.original_page{background-color:#fff;font-size:16px}.account_info{padding:0 0 20px}.account_info .flex_bd{padding-left:.85em}.radius_avatar.account_avatar{width:40px;height:40px;padding:0}.account_nickname{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;line-height:1.2;color:#576b95;font-size:14px}.account_nickname_inner{font-weight:400;vertical-align:top}.account_desc{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;color:#b2b2b2;font-size:13px;line-height:1.2;padding-top:.3em}.account_desc_inner{display:inline;vertical-align:top}.share_notice{margin-bottom:20px;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.share_media{padding-bottom:18px}.original_panel{padding:20px;background-color:#fcfcfc;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;overflow:hidden;position:relative}.original_panel:after{content:" ";border:1px solid #d8d8d8;border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;position:absolute;top:0;left:0;width:200%;height:200%;-webkit-transform:scale(0.5);transform:scale(0.5);-webkit-transform-origin:0 0;transform-origin:0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.original_panel .original_account{margin-bottom:18px;position:relative;z-index:1}.original_panel .original_account_avatar{width:28px;height:28px;padding:0}.original_panel .original_account_nickname{padding-left:.85em;font-size:15px;color:#576b95}.original_panel_title{font-size:23px;color:#000;margin:0 0 16px}.original_panel_content{color:#333}.original_panel_tool{padding-top:20px;position:relative;z-index:1}.original_cell_nickname{display:inline-block;vertical-align:middle;font-weight:400;width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;max-width:8em;color:#000}.original_tool_area{padding:1.17em 0;border-width:0;position:relative}.original_tool_area:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #dfdfdf;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.original_tool_area:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #dfdfdf;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.original_tool_area .radius_avatar{width:20px;height:20px;margin-right:.2em}.original_tool_area .flex_cell{padding:0;font-size:14px}.original_tool_area .icon_access:after{margin-right:4px;top:0}.preview_appmsg .rich_media_title{margin-top:1.5em}.preview_appmsg .account_info{padding-top:3em}.original_page{background-color:transparent}.account_info{-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0;padding-bottom:20px;font-size:14px}.account_info.appmsg_account_info{padding-bottom:32px}.account_info .radius_avatar img{background-color:transparent}.share_notice{font-size:16px;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.original_panel{background-color:#fafafa}.original_panel:after{border-color:#e6e6e6}.original_panel .original_account_avatar{width:30px;height:30px}.original_panel_tool{font-size:14px}.original_panel_tool a{color:#576b95}.original_panel_content{font-size:17px}.share_media{padding-bottom:30px}.icon_appmsg_tag{display:inline-block;vertical-align:middle;padding:0 .5em;font-size:12px;line-height:1.5;background-color:#c3c3c3;color:#fff;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;max-width:70%}.icon_appmsg_tag.primary{color:#3bb638;padding:4px .78em;background-color:rgba(9,187,7,0.08);font-size:12px;border-top-left-radius:.95em 50%;-moz-border-radius-topleft:.95em 50%;-webkit-border-top-left-radius:.95em 50%;border-top-right-radius:.95em 50%;-moz-border-radius-topright:.95em 50%;-webkit-border-top-right-radius:.95em 50%;border-bottom-left-radius:.95em 50%;-moz-border-radius-bottomleft:.95em 50%;-webkit-border-bottom-left-radius:.95em 50%;border-bottom-right-radius:.95em 50%;-moz-border-radius-bottomright:.95em 50%;-webkit-border-bottom-right-radius:.95em 50%}.icon_appmsg_tag.default{border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.3);background-color:transparent;padding:0 .54em;font-size:15px;line-height:1.3;border-top-left-radius:.67em 50%;-moz-border-radius-topleft:.67em 50%;-webkit-border-top-left-radius:.67em 50%;border-top-right-radius:.67em 50%;-moz-border-radius-topright:.67em 50%;-webkit-border-top-right-radius:.67em 50%;border-bottom-left-radius:.67em 50%;-moz-border-radius-bottomleft:.67em 50%;-webkit-border-bottom-left-radius:.67em 50%;border-bottom-right-radius:.67em 50%;-moz-border-radius-bottomright:.67em 50%;-webkit-border-bottom-right-radius:.67em 50%}.rich_media_meta_list .icon_appmsg_tag.default{margin-top:-1px}.icon_appmsg_tag.title_tag{background-color:#d04b4e}.icon_global_tag_wrp{text-align:right;padding-bottom:12px}.icon_global_tag{background-color:rgba(118,118,118,0.16);color:rgba(0,0,0,0.41);line-height:2.2;border-top-left-radius:1em 50%;-moz-border-radius-topleft:1em 50%;-webkit-border-top-left-radius:1em 50%;border-bottom-left-radius:1em 50%;-moz-border-radius-bottomleft:1em 50%;-webkit-border-bottom-left-radius:1em 50%;padding:0 1.8em 0 1.34em;font-size:12px;margin-right:-24px;display:inline-block;vertical-align:top}.global_plain_btn{display:inline-block;vertical-align:middle;padding:0 1em;line-height:2;font-size:14px;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.global_plain_btn.primary{color:#1aad19;border:1px solid currentColor}.global_plain_btn.primary:active{color:rgba(26,173,25,0.6)}.wx_video_context{color:#fefefe;position:relative;background-color:#000}.wx_video_thumb,.wx_video_thumb_primary{position:absolute;left:0;width:100%;height:100%!important;top:0}.wx_video_thumb_primary{-webkit-background-size:cover;background-size:cover;background-position:50% 50%;background-repeat:no-repeat}.wx_video_play_btn{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);margin-top:-2px;font-size:0;border-width:0;background-color:transparent;padding:0;outline:0;z-index:2}.wx_video_play_btn:before{content:" ";display:inline-block;width:0;height:0;border-width:14px 0 14px 25px;border-color:transparent transparent transparent #fff;border-style:dotted dotted dotted solid}.wx_video_mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:rgba(0,0,0,0.5)}.place_audio_area{min-height:100px;background-color:#fdfdfd;display:block;margin:16px 0}.place_music_area{min-height:68px;background-color:#fdfdfd;display:block;margin:17px 0 16px}.rich_media_empty_extra{background-color:#fafafa}.appmsg_skin_default.rich_media_empty_extra{background-color:#fff}.appmsg_skin_default .rich_media_area_primary{background-color:#fff}.appmsg_skin_default .rich_media_area_primary .weui-loadmore_line .weui-loadmore__tips{background-color:#fff}.appmsg_style_default .rich_media_tool{padding-top:15px}.rich_media_title_ios{font-weight:700}</style>
<style>
        </style>
<!--[if lt IE 9]>
<link rel="stylesheet" type="text/css" href="//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/pc3ec991.css">
<![endif]-->

    </head>
    <body id="activity-detail" class="zh_CN mm_appmsg  appmsg_skin_default appmsg_style_default">
      
        <link rel="dns-prefetch" href="//res.wx.qq.com">
<link rel="dns-prefetch" href="//mmbiz.qpic.cn">
<link rel="shortcut icon" type="image/x-icon" href="//res.wx.qq.com/mmbizwap/zh_CN/htmledition/images/icon/common/favicon22c41b.ico">

<script nonce="952631706" type="text/javascript">
        window.__moon_report_uin = "0";
            window.no_moon_ls = 0;
    </script>
        
<script nonce="952631706" type="text/javascript">
    var write_sceen_time = (+new Date());
</script>

<div id="js_article" class="rich_media">
    
    <div id="js_top_ad_area" class="top_banner"></div>
    
    <div class="rich_media_inner">

        
        
        <div id="page-content" class="rich_media_area_primary">
          <div class="rich_media_area_primary_inner">
                                    
                        

            <div id="img-content">

                
                <h2 class="rich_media_title" id="activity-name">
                    
                    
                    Redis真的那么好用吗？

                                                                                </h2>
                <div id="meta_content" class="rich_media_meta_list">
                                                                                
                                        
                                       
                                                                    
                                        <span class="rich_media_meta rich_media_meta_nickname" id="profileBt">
                      作者：<a href="javascript:void(0);" id="js_name">
                        python 爬虫与人工智能                      </a>
                      <div id="js_profile_qrcode" class="profile_container" style="display:none;">
                          <div class="profile_inner">
                              <strong class="profile_nickname">python 爬虫与人工智能</strong>
                              <img class="profile_avatar" id="js_profile_qrcode_img" src="" alt="">

                              
                          </div>
                          <span class="profile_arrow_wrp" id="js_profile_arrow_wrp">
                              <i class="profile_arrow arrow_out"></i>
                              <i class="profile_arrow arrow_in"></i>
                          </span>
                      </div>
                    </span>


                    <em id="publish_time" class="rich_media_meta rich_media_meta_text"></em>





                </div>
                
                
                
                
                                                
                                                                
                                
                
                <div class="rich_media_content " id="js_content">
                    

                    

                    
                    
                    <section class="mpa-template" data-mpa-template-id="1060" data-mpa-color="#ffffff" data-mpa-category="top_guide" data-mpa-powered-by="yiban.io"><section><blockquote style="padding: 15px;border-width: 1px;border-style: solid;border-color: rgb(221, 219, 217);white-space: normal;max-width: 100%;widows: 1;color: rgb(51, 51, 51);font-size: 12px;border-radius: 5px;background-color: rgb(255, 255, 255);margin: 0px;box-sizing: border-box !important;word-wrap: break-word !important;" mpa-from-tpl="t">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">Redis是什么</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">Redis是一个开源的底层使用C语言编写的key-value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型：string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set：有序集合)</span></p><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="letter-spacing: 1px;font-size: 24px;">Redis在项目中的应用场景</span></p></section><section style="margin: 5px 1em;font-size: 1em;line-height: 1;color: rgb(33, 33, 34);border-color: rgb(33, 33, 34);">
<p class="active brush" style="color: rgb(121,121,121);font-family: &#39;Microsoft YaHei&#39;, Arial, Helvetica, sans-serif;font-size: 15px;line-height: 24px;text-align: center;"><br  /></p></section></section></section></section></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">1、缓存数据</span><br  /></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">最常用，对经常需要查询且变动不是很频繁的数据 常称作热点数据。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">2、消息队列</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">相当于消息订阅系统，比如ActiveMQ、RocketMQ。如果对数据有较高一致性要求时，还是建议使用MQ)</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">3、计数器</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">比如统计点击率、点赞率，redis具有原子性，可以避免并发问题<br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">4、电商网站信息</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">大型电商平台初始化页面数据的缓存。比如去哪儿网购买机票的时候首页的价格和你点进去的价格会有差异。<br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">5、热点数据</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">比如新闻网站实时热点、微博热搜等，需要频繁更新。总数据量比较大的时候直接从数据库查询会影响性能</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">给个爱的理由</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">在单节点服务器我们通常是这样的</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="text-align: center;line-height: 2em;"><img class="" data-ratio="0.21380243572395127" data-s="300,640" src="/images/articles/20181020002_001.webp" data-type="png" data-w="739" style=""  /></p>
<p style="line-height: 2em;"><span style="font-size: 16px;letter-spacing: 1px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">随着企业的发展、业务的扩展。面对海量的数据，直接使用MySql会导致性能下降，数据的读写也会非常慢。于是我们就可以搭配缓存来处理海量数据。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">于是现在我们是这样的：</span></p>
<p style="text-align: center;line-height: 2em;"><img class="" data-ratio="0.23816568047337278" data-s="300,640" src="/images/articles/20181020002_002.webp" data-type="png" data-w="676" style=""  /></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">上图只是简述了缓存的作用，当数据继续增大我们需要利用主从复制技术来达到读写分离</span></p>
<p><br  /></p>
<p style="line-height: 2em;"><span style="font-size: 16px;">数据库层直接与缓存进行交互，如果缓存中有数据直接返回客户端，如果没有才会从MySql中去查询。从而减小了数据库的压力，提升了效率。</span></p>
<p><br  /></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">平时发布了一款新手机，会有抢购活动。同一时间段，服务端会收到很多的下单请求。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">我们需要使用redis的原子操作来实现这个“单线程”。首先我们把库存存在一个列表中，假设有10件库存，就往列表中push10个数，这个数没有实际意义，仅仅只是代表10件库存。抢购开始后，每到来一个用户，就从列表中pop一个数，表示用户抢购成功。当列表为空时，表示已经被抢光了。因为列表的pop操作是原子的，即使有很多用户同时到达，也是依次执行的</span></p>
<p><br  /></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">题外话：还有的抢购是直接在前端页面限制请求，这些请求直接被前端拦截，并没有到后端服务器</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="font-size: 16px;"><strong><span style="font-size: 16px;letter-spacing: 1px;">Redis为什么会这么快</span></strong></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">1、Redis是纯内存操作，需要的时候需要我们手动持久化到硬盘中</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">2、Redis是单线程，从而避开了多线程中上下文频繁切换的操作。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">3、Redis数据结构简单、对数据的操作也比较简单</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">4、使用底层模型不同，它们之间底层实现方式以及与客户端之间通信的应用协议不一样，Redis直接自己构建了VM 机制 ，因为一般的系统调用系统函数的话，会浪费一定的时间去移动和请求</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">5、使用多路I/O复用模型，非阻塞I/O</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p><section class="mpa-template" data-mpa-template-id="1397" data-mpa-color="#ffffff" data-mpa-category="quote"><section class="" style="margin: 0px;padding: 0px;"><section class="" style="margin: 0px;padding: 0px;text-align: center;"><section class="" style="margin: 0px;padding: 0px;display: inline-block;vertical-align: top;"><section class="" style="margin: 0px;padding: 0px 12px;background-color: rgb(254, 255, 255);font-size: 12px;color: rgb(188, 58, 6);line-height: 2;letter-spacing: 5px;">
<p style="clear: none;min-height: 1em;"><strong style="margin: 0px;padding: 0px;" mpa-from-tpl="t">多路I/O复用</strong></p></section><section style="margin: -14px 0px 0px;padding: 0px;width: 6px;height: 6px;border-radius: 100%;float: left;"></section><section style="margin: -14px 0px 0px;padding: 0px;width: 6px;height: 6px;border-radius: 100%;float: right;"></section><section style="margin: 0px;padding: 0px;clear: both;"></section></section><section class="" style="margin: -12px 0px 0px;padding: 10px;border-width: 2px;border-style: solid;border-color: rgb(0, 0, 0);"><section class="" style="margin: 0px;padding: 0px;"><section class="" style="margin: 0px;padding: 0px;"><section class="" style="margin: 0px;padding: 0px 15px;text-align: justify;font-size: 12px;color: rgb(64, 165, 195);line-height: 2;letter-spacing: 1px;">
<p style="clear: both;min-height: 1em;line-height: 2em;"><span style="font-size: 16px;">I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术，可以监视多个描述符，一旦某个描述符就绪（一般是读就绪或者写就绪，就是这个文件描述符进行读写操作之前），能够通知程序进行相应的读写操作</span><br  /></p>
<p style="clear: both;min-height: 1em;"><span style="margin: 0px;padding: 0px;line-height: 2;"></span></p></section></section></section></section></section></section></section>
<p><span style="font-size: 15px;"><strong><span style="letter-spacing: 1px;"></span></strong></span><br  /></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">Redis数据类型应用场景</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">前面提到了Redis支持五种丰富的数据类型，那么在不同场景下我们该怎么选择呢？</span></p><section class="mpa-template" data-mpa-template-id="1337" data-mpa-color="#ffffff" data-mpa-category="title">
<p style="border-width: 0px;border-style: none;border-color: initial;line-height: 2em;"><br  /></p><section style="width:100%;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;" data-width="100%"><section style="padding-top: 6px;margin-right: 4px;"></section><section style="border-width: 2px;border-style: dashed;border-color: rgb(100, 134, 98);height: 35px;padding-right: 20px;padding-left: 20px;border-radius: 16px;line-height: 33px;" class="" data-brushtype="text"><span style="font-size: 16px;"><strong mpa-from-tpl="t"><span style="font-size: 16px;color: rgb(89, 89, 89);font-family: Optima-Regular, PingFangTC-light;letter-spacing: 2px;line-height: 22.4px;">String</span></strong></span></section></section>
<p><br  /></p></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">字符串是最常用的数据类型，他能够存储任何类型的字符串，当然也包括二进制、JSON化的对象、甚至是base64编码之后的图片。在Redis中一个字符串最大的容量为512MB，可以说是无所不能了。</span></p>
<p style="line-height: 2em;"><br  /></p><section class="mpa-template" data-mpa-template-id="1337" data-mpa-color="#ffffff" data-mpa-category="title"><section style="width:100%;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;" data-width="100%"><section style="padding-top: 6px;margin-right: 4px;"></section><section style="border-width: 2px;border-style: dashed;border-color: rgb(100, 134, 98);height: 35px;padding-right: 20px;padding-left: 20px;border-radius: 16px;line-height: 33px;" class="" data-brushtype="text"><span style="color: rgb(89, 89, 89);font-family: Optima-Regular, PingFangTC-light;letter-spacing: 2px;font-size: 16px;"><strong>Hash</strong></span></section></section>
<p><br  /></p></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息，只需要通过Key取出Value进行反序列化修改某一项的值，再序列化存储到Redis中，Hash结构存储，由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储，所以可以大量节约内存。这一点在String结构里是不存在的。</span></p><section class="mpa-template" data-mpa-template-id="1337" data-mpa-color="#ffffff" data-mpa-category="title">
<p style="border-width: 0px;border-style: none;border-color: initial;line-height: 2em;"><br  /></p><section style="width:100%;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;" data-width="100%"><section style="padding-top: 6px;margin-right: 4px;"></section><section style="border-width: 2px;border-style: dashed;border-color: rgb(100, 134, 98);height: 35px;padding-right: 20px;padding-left: 20px;border-radius: 16px;line-height: 33px;" class="" data-brushtype="text"><span style="font-size: 16px;"><strong mpa-from-tpl="t"><span style="font-size: 16px;color: rgb(89, 89, 89);font-family: Optima-Regular, PingFangTC-light;letter-spacing: 2px;line-height: 22.4px;">List</span></strong></span></section></section>
<p><br  /></p></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">List的实现为一个双向链表，即可以支持反向查找和遍历，更方便操作，不过带来了部分额外的内存开销，Redis 内部的很多实现，包括发送缓冲队列等也都是用的这个数据结构。另外，可以利用 lrange 命令，做基于 Redis 的分页功能，性能极佳，用户体验好。</span></p>
<p><br  /></p><section class="mpa-template" data-mpa-template-id="1337" data-mpa-color="#ffffff" data-mpa-category="title"><section style="width:100%;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;" data-width="100%"><section style="padding-top: 6px;margin-right: 4px;"></section><section style="border-width: 2px;border-style: dashed;border-color: rgb(100, 134, 98);height: 35px;padding-right: 20px;padding-left: 20px;border-radius: 16px;line-height: 33px;" class="" data-brushtype="text"><span style="font-size: 16px;"><strong mpa-from-tpl="t"><span style="font-size: 16px;color: rgb(89, 89, 89);font-family: Optima-Regular, PingFangTC-light;letter-spacing: 2px;line-height: 22.4px;">Set</span></strong></span></section></section>
<p><br  /></p></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">set 对外提供的功能与 list 类似是一个列表的功能，特殊之处在于 set 是可以自动排重的，当你需要存储一个列表数据，又不希望出现重复数据时，这个时候就可以选择使用set。</span></p>
<p style="line-height: 2em;"><br  /></p><section class="mpa-template" data-mpa-template-id="1337" data-mpa-color="#ffffff" data-mpa-category="title"><section style="width:100%;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;" data-width="100%"><section style="padding-top: 6px;margin-right: 4px;"></section><section style="border-width: 2px;border-style: dashed;border-color: rgb(100, 134, 98);height: 35px;padding-right: 20px;padding-left: 20px;border-radius: 16px;line-height: 33px;" class="" data-brushtype="text"><span style="font-size: 16px;"><strong mpa-from-tpl="t"><span style="font-size: 16px;color: rgb(89, 89, 89);font-family: Optima-Regular, PingFangTC-light;letter-spacing: 2px;line-height: 22.4px;">Sorted Set</span></strong></span></section></section>
<p><br  /></p></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">可以按照某个条件的权重进行排序，比如可以通过点击数做出排行榜的数据应用。</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">Redis缓存的数据一致性</span><br  /></p></section><section style="margin: 5px 1em;font-size: 1em;line-height: 1;color: rgb(33, 33, 34);border-color: rgb(33, 33, 34);">
<p class="active brush" style="color: rgb(121,121,121);font-family: &#39;Microsoft YaHei&#39;, Arial, Helvetica, sans-serif;font-size: 15px;line-height: 24px;text-align: center;"><br  /></p></section></section></section></section></section></section></section></section></section></section></section></section>
<p style="line-height: 2em;"><span style="font-size: 16px;letter-spacing: 1px;">真正意义上来讲数据库的数据和缓存的数据是不可能一致的，数据分为最终一直和强一致两类。如果业务中对数据的要求必须强一直那么就不能使用缓存。缓存能做的只能保证数据的最终一致性。<br  /></span></p>
<p style="line-height: 2em;"><span style="font-size: 16px;letter-spacing: 1px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">我们能做的只能是尽可能的保证数据的一致性。不管是先删库再删缓存 还是 先删缓存再删库，都可能出现数据不一致的情况，因为读和写操作是并发的，我们没办法保证他们的先后顺序。具体应对策略还是要根据业务需求来定，这里就不赘述了。</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">Redis过期和内存淘汰</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">Redis存储数据时我们可以设置他的过期时间。但是这个key是怎么删除的呢？</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">一开始我认为是定时删除，后来发现并不是这样，因为如果定时删除，需要一个定时器来不断的负责监控这个key，虽然内存释放了，但是非常消耗cpu资源。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">Redis过期删除采用的是定期删除，默认是每100ms检测一次，遇到过期的key则进行删除，这里的检测并不是顺序检测，而是随机检测。那这样会不会有漏网之鱼？显然Redis也考虑到了这一点，当我们去读/写一个已经过期的key时，会触发Redis的惰性删除策略，直接回干掉过期的key</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">内存淘汰是指用户存储的一部分key是可以被Redis自动的删除，从而会出现从缓存中查不到数据的情况。加入我们的服务器内存为2G、但是随着业务的发展缓存的数据已经超过2G了。但是这并不影响我们程序的运行，因为操作系统的可见内存并不受物理内存的限制。物理内存不够用没关系，计算机会从硬盘中划出一片空间来作为虚拟内存。这就是Redis设计两种应用场景的初衷：缓存、持久存储</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">缓存击穿</span></p></section><section style="margin: 5px 1em;font-size: 1em;line-height: 1;color: rgb(33, 33, 34);border-color: rgb(33, 33, 34);">
<p class="active brush" style="color: rgb(121,121,121);font-family: &#39;Microsoft YaHei&#39;, Arial, Helvetica, sans-serif;font-size: 15px;line-height: 24px;text-align: center;"><br  /></p></section></section></section></section></section></section></section></section></section></section></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">缓存只是为了缓解数据库压力而添加的一层保护层，当从缓存中查询不到我们需要的数据就要去数据库中查询了。如果被黑客利用，频繁去访问缓存中没有的数据，那么缓存就失去了存在的意义，瞬间所有请求的压力都落在了数据库上，这样会导致数据库连接异常。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">解决方案：</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">1、后台设置定时任务，主动的去更新缓存数据。这种方案容易理解，但是当key比较分散的时候，操作起来还是比较复杂的</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">2、分级缓存。比如设置两层缓存保护层，1级缓存失效时间短，2级缓存失效时间长。有请求过来优先从1级缓存中去查找，如果在1级缓存中没有找到相应数据，则对该线程进行加锁，这个线程再从数据库中取到数据，更新至1级和2级缓存。其他线程则直接从2级线程中获取</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">3、提供一个拦截机制，内部维护一系列合法的key值。当请求的key不合法时，直接返回。</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">缓存雪崩</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">缓存雪崩就是指缓存由于某些原因（比如 宕机、cache服务挂了或者不响应）整体crash掉了，导致大量请求到达后端数据库，从而导致数据库崩溃，整个系统崩溃，发生灾难，也就是上面提到的缓存击穿</span></p>
<p><span style="font-size: 14px;letter-spacing: 1px;"><br  /></span></p>
<p><span style="font-size: 14px;letter-spacing: 1px;"><img class="" data-ratio="0.47904869762174407" src="/images/articles/20181020002_003.webp" data-type="jpeg" data-w="883"  /></span></p>
<p><span style="letter-spacing: 1px;font-size: 12px;color: rgb(178, 178, 178);">图片来源自网络</span></p>
<p><span style="font-size: 14px;letter-spacing: 1px;"><br  /></span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">如何避免雪崩：</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">1、给缓存加上一定区间内的随机生效时间，不同的key设置不同的失效时间，避免同一时间集体失效。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">2、和缓存击穿解决方案类似，做二级缓存，原始缓存失效时从拷贝缓存中读取数据。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">3、利用加锁或者队列方式避免过多请求同时对服务器进行读写操作。</span></p><section class="mpa-template" data-mpa-template-id="1478" data-mpa-color="#ffffff" data-mpa-category="title"><section data-role="outer" style="font-size: 16px;"><section data-id="93287" style="border-width: 0px;border-style: none;border-color: initial;"><section style="padding: 10px;"><section style="width: 100%;text-align: center;" data-width="100%"><section style="display: inline-block;width: auto;"><section class="xmt-style-block" data-style-type="1" data-tools="新媒体排版" data-id="13006"><section class="KolEditor" style="border-width: 0px;border-style: none;border-color: initial;padding: 0px;margin-top: 20px;"><section style="border-width: 0px;border-style: none;border-color: initial;"><section style="border-width: 0px;border-style: initial;border-color: initial;text-align: center;"><section style="display: inline-block;color: inherit;"><section class="active brush" style="margin-top: 0.2em;padding-right: 0.5em;padding-bottom: 5px;padding-left: 0.5em;color: rgb(255,140,0);font-size: 1.8em;line-height: 1;border-bottom-width: 1px;border-bottom-style: solid;border-color: rgb(255,140,0);">
<p style="font-size:1em;color: rgb(255,140,0);"><span style="font-size: 24px;">结语</span></p></section></section></section></section></section></section></section></section></section></section>
<p><br  /></p></section></section>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">Redis的性能极高，读的速度是110000次/s,写的速度是81000次/s，支持事务，支持备份，丰富的数据类型。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">任何事情都是两面性，Redis也是有缺点的：</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">1、由于是内存数据库，所以单台机器存储的数据量是有限的，需要开发者提前预估，需要及时删除不需要的数据。</span></p>
<p style="line-height: 2em;"><span style="letter-spacing: 1px;font-size: 16px;">2、当修改Redis的数据之后需要将持久化到硬盘的数据重新加入到内容中，时间比较久，这个时候Redis是无法正常运行的。</span></p>
<p><br  /></p>
                </div>
                
                            </div>
                                    
                        


            


                      </div>
        </div>


    </div>
</div>


        <div style="text-align:center;">
    &nbsp; &nbsp; &nbsp; &nbsp;  <a href="http://www.miibeian.gov.cn" target="_blank">京ICP备15003959号</a> &nbsp;   &nbsp; 
<script src='http://s22.cnzz.com/stat.php?id=3593514&web_id=3593514' language='JavaScript'></script> &nbsp;   &nbsp; 
<a href="https://mp.weixin.qq.com/s/BswDnTdGitMODMjJwQsDtQ" target="_blank">原文链接</a>
</div>
    </body>
</html>

